home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-12-13 | 4.8 KB | 194 lines | [TEXT/KAHL] |
- /*
- Based on a demo by N. Jonas Englund.
-
- Substantially improved and altered by Ingemar Ragnemalm 1994
-
- - Better function naming, Mac-standard
- - Simplified (removed unnecessary checks)
- - Pascal library and interface
- - Fade to anything, not just black
- - Checks color table size
- - Checks for CQD
- - Works with both Think and MetroWerks.
- */
-
-
- //================================= INCLUDES ====================================
-
- #include "fade.h"
-
- //================================= FUNCTIONS ===================================
-
- static void CopyCluts (GDHandle);
- static void CalcFade (short, FadeValues*, RGBColor fadeTo);
- static void FadeOut (short, FadeValues, RGBColor fadeTo);
- static void FadeIn (short, FadeValues, RGBColor fadeTo);
- static void BlackOut (RGBColor fadeTo);
- static void RestoreClut(void);
-
- //================================== GLOBALS ====================================
-
- CTabHandle gFade, // 'clut' to alter with fading functions
- gOrig; // 'clut' to hold a copy of original
- Handle gTempH; // temporary handle to copy 'clut'
-
- short gCtSize;
- short gCtSeedSave; // Must save and restore the seed!
-
- /********************************** fade_screen *********************************/
- extern
- pascal void FadeScreen(short speed, Boolean fadeOut, RGBColor fadeTo)
- {
- GDHandle oldDev, hGD;
- FadeValues rgbs;
- SysEnvRec world;
-
- if (noErr != SysEnvirons(1, &world)) return;
- if (!world.hasColorQD) return;
-
- gTempH = nil;
- oldDev = GetGDevice();
- hGD = GetMainDevice();
-
- gCtSize = (*(*(*hGD)->gdPMap)->pmTable)->ctSize; /* Yet another case where Pascal is a lot simpler.*/
- if (gCtSize < 1) return; // Can't run if no CLUT!
- if (gCtSize > kMaxByte) return; // We don't expect that big CLUTs!
- if ((*(*hGD)->gdPMap)->pixelSize > 8) return; // ctSize isn't 100% reliable! Check pixel size too!
-
- SetGDevice(hGD);
-
- CopyCluts(hGD);
- CalcFade(speed, &rgbs, fadeTo);
-
- if (fadeOut)
- FadeOut(speed, rgbs, fadeTo);
- else
- FadeIn(speed, rgbs, fadeTo);
-
- RestoreClut();
-
- // TEST - make sure we restore properly
- if (!fadeOut) SetEntries(0, gCtSize, (*gOrig)->ctTable);
-
- SetGDevice(oldDev);
-
- if (gTempH != nil) DisposeHandle(gTempH);
- }
- /*** fade_screen ***/
-
-
-
- /*
- Rutiner in:
- FadeIn
- FadeInAll
- FadeInMain
- FadeOut
- FadeOutAll
- FadeOutMain
- */
-
- /********************************** CopyCluts **********************************/
- static
- void CopyCluts(GDHandle hGD)
- {
- gFade = (*(*hGD)->gdPMap)->pmTable;
- gTempH = (Handle) (*(*hGD)->gdPMap)->pmTable;
- HandToHand(&gTempH);
- gOrig = (CTabHandle) gTempH;
-
- HLock((Handle) gFade);
- HLock((Handle) gOrig);
- }
-
- /*********************************** CalcFade **********************************/
- static
- void CalcFade(short speed, FadeValues *rgbs, RGBColor fadeTo)
- {
- short i;
-
- for (i = 0; i <= gCtSize; i++)
- {
- rgbs->reds[i] = ((long)(*gFade)->ctTable[i].rgb.red - (long)fadeTo.red) / speed;
- rgbs->greens[i] = ((long)(*gFade)->ctTable[i].rgb.green - (long)fadeTo.green) / speed;
- rgbs->blues[i] = ((long)(*gFade)->ctTable[i].rgb.blue - (long)fadeTo.blue) / speed;
- }
- }
-
- /*********************************** FadeOut ***********************************/
- static
- void FadeOut(short speed, FadeValues rgbs, RGBColor fadeTo)
- {
- short i, j;
-
- gCtSeedSave = (*gFade)->ctSeed; // Save!
-
- for (j = speed; j > 0; j--)
- {
- for (i = 0; i <= gCtSize; i++)
- {
- (*gFade)->ctTable[i].rgb.red -= rgbs.reds[i];
- (*gFade)->ctTable[i].rgb.green -= rgbs.greens[i];
- (*gFade)->ctTable[i].rgb.blue -= rgbs.blues[i];
- }
- SetEntries(0, gCtSize, (*gFade)->ctTable);
- }
- BlackOut(fadeTo);
- }
-
- /************************************ FadeIn ***********************************/
- static
- void FadeIn(short speed, FadeValues rgbs, RGBColor fadeTo)
- {
- short i, j;
-
- BlackOut(fadeTo);
-
- for (j = 0; j < speed; j++)
- {
- for (i = 0; i <= gCtSize; i++)
- {
- (*gFade)->ctTable[i].rgb.red += rgbs.reds[i];
- (*gFade)->ctTable[i].rgb.green += rgbs.greens[i];
- (*gFade)->ctTable[i].rgb.blue += rgbs.blues[i];
- }
- SetEntries(0, gCtSize, (*gFade)->ctTable);
- }
-
- (*gFade)->ctSeed = gCtSeedSave; // Restore!
- }
-
- /*********************************** BlackOut **********************************/
- static
- void BlackOut(RGBColor fadeTo)
- {
- short i;
-
- for (i = 0; i <= gCtSize; i++)
- {
- (*gFade)->ctTable[i].rgb.red = fadeTo.red;
- (*gFade)->ctTable[i].rgb.green = fadeTo.green;
- (*gFade)->ctTable[i].rgb.blue = fadeTo.blue;
- }
- SetEntries(0, gCtSize, (*gFade)->ctTable);
- }
-
- /********************************** RestoreClut ********************************/
- static
- void RestoreClut(void)
- {
- short i;
-
- for (i = 0; i <= gCtSize; i++)
- {
- (*gFade)->ctTable[i].rgb.red = (*gOrig)->ctTable[i].rgb.red;
- (*gFade)->ctTable[i].rgb.green = (*gOrig)->ctTable[i].rgb.green;
- (*gFade)->ctTable[i].rgb.blue = (*gOrig)->ctTable[i].rgb.blue;
- }
- (*gFade)->ctSeed = GetCTSeed();
- MakeITable(nil, nil, 0);
-
- HUnlock((Handle) gFade);
- HUnlock((Handle) gOrig);
- }
-